package com.haojin.java;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * @author .29.
 * @create 2022-04-13 6:22
 */

/*
1.泛型在继承方面的体现

2.通配符的使用
 */
public class GenericTest1 {
    /*
    1.泛型在继承方面的体现
      虽然：类A是类B的父类，但G<A>,G<B>不具备继承关系,两者并列关系
            补充：类A是类B的父类，则A<G>是B<G>的父类
     */
    @Test
    public void test1(){
        List<Object> obj = null;
        List<String> str = null;
        ArrayList<String> str1 = new ArrayList<>();
//        此时obj与str的类型不具备子父类关系
//        编译不通过
//        obj = str;
        str = str1;
    }

    @Test
    public void test2(){
        /*
        2.通配符的使用
          通配符：<?>

          类A是类B的父类； G<A>,G<B>不具备继承关系，G<?>是二者通用父类
         */
        List<Object> obj = null;
        List<String> str = null;
        List<?> list = null;
        list = obj;
        list = str;

        //
        List<String> list1 = new ArrayList<>();
        list1.add("aa");
        list = list1;
        //添加：对于List<?>就不能向内部添加数据，null除外
//        list.add("aa");//编译不通过
        list.add(null);

        //获取(读取)；允许读取数据，读取的数据类型为Object
        Object o = list.get(0);
        System.out.println(o);
    }

    /*
 3.有限制条件的通配符的使用
    ? extends A:
            G<? extends A>可以作为G<A>,G<B>的父类，其中B是A的子类
    ? super A:
            G<? super A>可以作为G<A>,G<B>的父类，其中B是A的父类
  */
  @Test
  public void test3(){
    List<? extends Person> list1 = null;
    List<? super Person> list2 = null;

    List<Student> list3 = null;
    List<Person> list4 = null;
    List<Object> list5 = null;

    list1 = list3;
    list1 = list4;
//    list1 = list5;

//    list2 = list3;
    list2 = list4;
    list2 = list5;
  }
}
